/****************************************************************************************** Import */
import _ from 'lodash';
import Http from './base/http';
import Collect from './helper/colelct';
import Session from '../session';
import Url from '../../../../../config/global/url';

/****************************************************************************************** Class */
export default class HttpTrans extends Http {

    /************************************************************************************** 特殊重写方法（为get和post添加config.url前缀） */
    /**
     * get请求，参数请看_request方法
     * 
     * @param {Object} obj 访问请求设置对象 
     */
    static get(obj) {
        obj.url = Url.restful + obj.url;
        super.get(obj);
    }

    /**
     * post请求，参数请看_request方法
     * 
     * @param {Object} obj 访问请求设置对象 
     */
    static post(obj) {
        obj.url = Url.restful + obj.url;
        super.post(obj);
    }

    /************************************************************************************** 必须重写方法 */
    /**
     * 重写父类getHeaders方法
     */
    static getHeaders() {
    
        // 获取session中的headers
        const httpAuths = Session.get('system_http_auths');

        // 判断http auth是否存在
        if (httpAuths == null) console.error('系统没有进行Arrive操作，httpAuths不存在！');
        
        return {
            // "Content-Type": "multipart/form-data ",
            // 'Accept': 'application/json',
            'Authorization': JSON.stringify(httpAuths)
            // 'Authorization': JSON.stringify(auth)
        };
    }

    /**
     * 重写父类parse方法
     * 
     * @param {String} text 从服务器返回的原始字符串
     * @param {Object} obj 设置对象
     */
    static parse(text, obj) {

        // 判断字符串是否能被解析为json对象，如果成功则将text转换为json，否则报chaos混乱错误（无法解析）
        // 注意：taro有时会自动将字符串转换为json，所以，这里需要做判断，看text是否为string，如果已经是json，就不要转转了
        if (_.isString(text)) {
            try {
                text = JSON.parse(text);
            } catch(e) {
                Collect.chaos(text, obj);
                if (_.isFunction(obj.pipe.chaos)) {
                    obj.pipe.chaos(text, obj);
                }
                return;
            }
        }

        // 转换为json
        const json = _.isString(text) ? JSON.parse(text) : text;

        // json格式判断，如果返回没有带code字段，则说明服务器出错，收集错误，调用错误回调，并直接返回
        if (!_.has(json, 'code') || !_.has(json, 'msg')) {
            Collect.chaos(text, obj);
            if (_.isFunction(obj.pipe.chaos)) {
                obj.pipe.chaos(text, obj);
            }
            return;
        }

        // 逻辑错误判断，如果code不等于0，则说明存在逻辑错误，收集错误，调用错误回调，并直接返回
        // 注意：此处如果obj下没有error，则会使用fail.error
        if (parseInt(json.code) != 0) {
            if (_.isFunction(obj.pipe.error)) {
                obj.pipe.error(json, obj);
            } 
            return;
        }

        // 已经全部正确正确，调用success回调
        if (_.isFunction(obj.pipe.success)) {
            obj.pipe.success(json.data, obj);
        }
    }
}
